/*
 * Copyright (C) 2012 The Guava Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.common.base;

/**
 * Common benchmarking utilities.
 *
 * @author Christopher Swenson
 * @author Louis Wasserman
 */
class BenchmarkHelpers
{
    private static final String WHITESPACE_CHARACTERS =
            "\u00a0\u180e\u202f\t\n\013\f\r \u0085"
                    + "\u1680\u2028\u2029\u205f\u3000\u2000\u2001\u2002\u2003\u2004\u2005"
                    + "\u2006\u2007\u2008\u2009\u200a";
    private static final String ASCII_CHARACTERS;

    static
    {
        int spaceInAscii = 32;
        int sevenBitAsciiMax = 128;
        StringBuilder sb = new StringBuilder(sevenBitAsciiMax - spaceInAscii);
        for (int ch = spaceInAscii; ch < sevenBitAsciiMax; ch++)
        {
            sb.append((char) ch);
        }
        ASCII_CHARACTERS = sb.toString();
    }

    private static final String ALL_DIGITS;

    static
    {
        StringBuilder sb = new StringBuilder();
        String zeros =
                "0\u0660\u06f0\u07c0\u0966\u09e6\u0a66\u0ae6\u0b66\u0be6\u0c66"
                        + "\u0ce6\u0d66\u0e50\u0ed0\u0f20\u1040\u1090\u17e0\u1810\u1946"
                        + "\u19d0\u1b50\u1bb0\u1c40\u1c50\ua620\ua8d0\ua900\uaa50\uff10";
        for (char base : zeros.toCharArray())
        {
            for (int offset = 0; offset < 10; offset++)
            {
                sb.append((char) (base + offset));
            }
        }
        ALL_DIGITS = sb.toString();
    }

    /**
     * Sample CharMatcher instances for benchmarking.
     */
    public enum SampleMatcherConfig
    {
        WHITESPACE(CharMatcher.whitespace(), WHITESPACE_CHARACTERS),
        HASH(CharMatcher.is('#'), "#"),
        ASCII(CharMatcher.ascii(), ASCII_CHARACTERS),
        WESTERN_DIGIT("0123456789"),
        ALL_DIGIT(CharMatcher.digit(), ALL_DIGITS),
        OPS_5("+-*/%"),
        HEX_16(CharMatcher.inRange('0', '9').or(CharMatcher.inRange('A', 'F')), "0123456789ABCDEF"),
        HEX_22(
                CharMatcher.inRange('0', '9')
                        .or(CharMatcher.inRange('A', 'F'))
                        .or(CharMatcher.inRange('a', 'f')),
                "0123456789ABCDEFabcdef"),
        GERMAN_59(
                CharMatcher.inRange('a', 'z')
                        .or(CharMatcher.inRange('A', 'Z'))
                        .or(CharMatcher.anyOf("äöüßÄÖÜ")),
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZäöüßÄÖÜ");

        public final CharMatcher matcher;
        public final String matchingChars;

        SampleMatcherConfig(String matchingChars)
        {
            this(CharMatcher.anyOf(matchingChars), matchingChars);
        }

        SampleMatcherConfig(CharMatcher matcher, String matchingChars)
        {
            this.matcher = matcher;
            this.matchingChars = matchingChars;
        }
    }
}
